#include "nodo.h"

// costruttore
/*Residuo::Residuo(int l=1, int rs=1,
                 Nodo* cn=NULL, Residuo* s=NULL, string m=""):
lunghezza(l),resto(rs),continuazione(cn),succ(s),multipli(m){}*/

// Costruttore di copia profonda
Residuo::Residuo(Residuo& x):
lunghezza(x.lunghezza),resto(x.resto),multipli(x.multipli) {
  if (x.continuazione == NULL) continuazione=NULL;
  else continuazione = new Nodo(*(x.continuazione));
  if (x.succ == NULL) succ=NULL;
  else succ = new Residuo(*(x.succ));
}

// distruttore profondo
Residuo::~Residuo(){
  delete continuazione;
  delete succ;
}

// costruttore
Nodo::Nodo(string f="10", int rs=2,
           Residuo* r=new Residuo(), string rst=""):
fattore(f),resto(rs),residui(r),resti(rst){}

// Costruttore di copia profonda
Nodo::Nodo(Nodo& x):
fattore(x.fattore),resto(x.resto),resti(x.resti){
  if (x.residui == NULL) residui = NULL;
  else residui = new Residuo(*(x.residui));
}

//calcolo lo shift
int Nodo::shift(){
    //trovo la massima occorrenza di zeri, concateno
    string test = fattore+fattore;

    int pos=0;
    int max=0;
    int occ=0;
    for(int i=0; i<test.size();i++){
        if (test[i]=='0') occ++;
        else occ=0;
        if (max<occ) {
            pos=i-occ+1;
            max = occ;
        }
    }
    return pos;
}

// distruttore profondo
Nodo::~Nodo(){
  delete residui;
}
